@@ -58,14 +58,14 @@ urlpatterns += [  | 
            ||
| 58 | 58 | 
                url(r'^g/list$', group_views.group_list_api, name='group_list_api'), # 群组列表  | 
            
| 59 | 59 | 
                url(r'^g/lock$', group_views.group_lock_api, name='group_lock_api'), # 群组锁定  | 
            
| 60 | 60 | 
                url(r'^g/unlock$', group_views.group_unlock_api, name='group_unlock_api'), # 群组解锁  | 
            
| 61 | 
                - url(r'^g/data$', group_views.group_data_api, name='group_data_api'), # 群组数据, 评论数, 点赞数  | 
            |
| 61 | 
                + url(r'^g/data$', group_views.group_data_api, name='group_data_api'), # 群组数据,评论数,点赞数  | 
            |
| 62 | 62 | 
                ]  | 
            
| 63 | 63 | 
                 | 
            
| 64 | 
                -# 群用户相关  | 
            |
| 64 | 
                +# 群成员相关  | 
            |
| 65 | 65 | 
                urlpatterns += [  | 
            
| 66 | 
                - url(r'^g/join$', groupuser_views.group_user_join_api, name='group_join_api'), # 成员申请加群  | 
            |
| 67 | 
                - url(r'^g/remove$', groupuser_views.group_user_remove_api, name='group_remove_api'), # 成员移除, 管理员主动, 群成员被动  | 
            |
| 68 | 
                - url(r'^g/quit$', groupuser_views.group_user_quit_api, name='group_quit_api'), # 成员退出,群成员主动  | 
            |
| 66 | 
                + url(r'^g/join$', groupuser_views.group_user_join_api, name='group_join_api'), # 群成员加群  | 
            |
| 67 | 
                + url(r'^g/remove$', groupuser_views.group_user_remove_api, name='group_remove_api'), # 群成员移除,管理员主动,群成员被动  | 
            |
| 68 | 
                + url(r'^g/quit$', groupuser_views.group_user_quit_api, name='group_quit_api'), # 群成员退出,群成员主动  | 
            |
| 69 | 69 | 
                ]  | 
            
| 70 | 70 | 
                 | 
            
| 71 | 71 | 
                # 旅行团相关  | 
            
                @@ -80,12 +80,13 @@ urlpatterns += [  | 
            ||
| 80 | 80 | 
                url(r'^tg/transfer$', tourguidegroup_views.tg_group_transfer_api, name='tg_group_transfer_api'), # 旅行团权限管理转移  | 
            
| 81 | 81 | 
                ]  | 
            
| 82 | 82 | 
                 | 
            
| 83 | 
                -# 旅行团用户相关  | 
            |
| 83 | 
                +# 旅行团成员相关  | 
            |
| 84 | 84 | 
                urlpatterns += [  | 
            
| 85 | 
                - url(r'^tgu/join$', tourguidegroupuser_views.tgu_group_user_join_api, name='tgu_group_user_join_api'), # 旅行团用户加群  | 
            |
| 86 | 
                - url(r'^tgu/update$', tourguidegroupuser_views.tgu_group_user_update_api, name='tg_group_update_api'), # 旅行团用户更新  | 
            |
| 87 | 
                - url(r'^tgu/locations$', tourguidegroupuser_views.tgu_group_user_locations_api, name='tgu_group_user_locations_api'), # 旅行团所有用户位置信息  | 
            |
| 88 | 
                - url(r'^tgu/location$', tourguidegroupuser_views.tgu_group_user_location_api, name='tgu_group_user_location_api'), # 旅行团单个用户位置信息  | 
            |
| 85 | 
                + url(r'^tgu/join$', tourguidegroupuser_views.tgu_group_user_join_api, name='tgu_group_user_join_api'), # 旅行团成员加团  | 
            |
| 86 | 
                + url(r'^tgu/remove$', tourguidegroupuser_views.tgu_group_user_remove_api, name='tgu_group_user_remove_api'), # 旅行团成员移除,管理员主动,团成员被动  | 
            |
| 87 | 
                + url(r'^tgu/update$', tourguidegroupuser_views.tgu_group_user_update_api, name='tg_group_update_api'), # 旅行团成员信息更新  | 
            |
| 88 | 
                + url(r'^tgu/locations$', tourguidegroupuser_views.tgu_group_user_locations_api, name='tgu_group_user_locations_api'), # 旅行团所有成员位置信息  | 
            |
| 89 | 
                + url(r'^tgu/location$', tourguidegroupuser_views.tgu_group_user_location_api, name='tgu_group_user_location_api'), # 旅行团单个成员位置信息  | 
            |
| 89 | 90 | 
                ]  | 
            
| 90 | 91 | 
                 | 
            
| 91 | 92 | 
                # 飞图相关  | 
            
                @@ -21,7 +21,7 @@ r = settings.REDIS_CACHE  | 
            ||
| 21 | 21 | 
                 | 
            
| 22 | 22 | 
                @logit  | 
            
| 23 | 23 | 
                def group_user_join_api(request):  | 
            
| 24 | 
                - """ 申请加群 """  | 
            |
| 24 | 
                + """ 群成员加群 """  | 
            |
| 25 | 25 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 26 | 26 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 27 | 27 | 
                     nickname = request.POST.get('nickname', '')
               | 
            
                @@ -67,7 +67,7 @@ def group_user_join_api(request):  | 
            ||
| 67 | 67 | 
                 | 
            
| 68 | 68 | 
                curinfo = get_current_photos(group_id, user_id, group_user.current_id)  | 
            
| 69 | 69 | 
                 | 
            
| 70 | 
                -    return response(200, 'Apply Success', u'申请成功', {
               | 
            |
| 70 | 
                +    return response(200, 'Group User Join Success', u'群成员加群成功', {
               | 
            |
| 71 | 71 | 
                         'current_id': curinfo.get('current_id', ''),
               | 
            
| 72 | 72 | 
                         'photos': curinfo.get('photos', ''),
               | 
            
| 73 | 73 | 
                'group_id': group_id,  | 
            
                @@ -79,7 +79,7 @@ def group_user_join_api(request):  | 
            ||
| 79 | 79 | 
                 | 
            
| 80 | 80 | 
                @logit  | 
            
| 81 | 81 | 
                def group_user_remove_api(request):  | 
            
| 82 | 
                - """ 成员移除 """  | 
            |
| 82 | 
                + """ 群成员移除,管理员主动,群成员被动 """  | 
            |
| 83 | 83 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 84 | 84 | 
                     admin_id = request.POST.get('admin_id', '')
               | 
            
| 85 | 85 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
                @@ -96,7 +96,7 @@ def group_user_remove_api(request):  | 
            ||
| 96 | 96 | 
                 | 
            
| 97 | 97 | 
                # 群组用户校验  | 
            
| 98 | 98 | 
                try:  | 
            
| 99 | 
                - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)  | 
            |
| 99 | 
                + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True)  | 
            |
| 100 | 100 | 
                except GroupUserInfo.DoesNotExist:  | 
            
| 101 | 101 | 
                return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)  | 
            
| 102 | 102 | 
                 | 
            
                @@ -112,7 +112,7 @@ def group_user_remove_api(request):  | 
            ||
| 112 | 112 | 
                r.srem(GROUP_USERS_PASSED_SET % group_id, user_id)  | 
            
| 113 | 113 | 
                r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id)  | 
            
| 114 | 114 | 
                 | 
            
| 115 | 
                -    return response(200, 'Remove Success', u'用户移除成功', {
               | 
            |
| 115 | 
                +    return response(200, 'Group User Remove Success', u'群成员移除成功', {
               | 
            |
| 116 | 116 | 
                'group_id': group_id,  | 
            
| 117 | 117 | 
                'users': group_users,  | 
            
| 118 | 118 | 
                })  | 
            
                @@ -120,7 +120,7 @@ def group_user_remove_api(request):  | 
            ||
| 120 | 120 | 
                 | 
            
| 121 | 121 | 
                @logit  | 
            
| 122 | 122 | 
                def group_user_quit_api(request):  | 
            
| 123 | 
                - """ 成员退出 """  | 
            |
| 123 | 
                + """ 群成员退出,群成员主动 """  | 
            |
| 124 | 124 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 125 | 125 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 126 | 126 | 
                 | 
            
                @@ -136,7 +136,7 @@ def group_user_quit_api(request):  | 
            ||
| 136 | 136 | 
                 | 
            
| 137 | 137 | 
                # 群组用户校验  | 
            
| 138 | 138 | 
                try:  | 
            
| 139 | 
                - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)  | 
            |
| 139 | 
                + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True)  | 
            |
| 140 | 140 | 
                except GroupUserInfo.DoesNotExist:  | 
            
| 141 | 141 | 
                return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)  | 
            
| 142 | 142 | 
                 | 
            
                @@ -152,7 +152,7 @@ def group_user_quit_api(request):  | 
            ||
| 152 | 152 | 
                r.srem(GROUP_USERS_PASSED_SET % group_id, user_id)  | 
            
| 153 | 153 | 
                r.sadd(GROUP_USERS_QUIT_SET % group_id, user_id)  | 
            
| 154 | 154 | 
                 | 
            
| 155 | 
                -    return response(200, 'Quit Success', u'用户退出成功', {
               | 
            |
| 155 | 
                +    return response(200, 'Group User Quit Success', u'群成员退出成功', {
               | 
            |
| 156 | 156 | 
                'group_id': group_id,  | 
            
| 157 | 157 | 
                'users': group_users,  | 
            
| 158 | 158 | 
                })  | 
            
                @@ -5,6 +5,7 @@ from __future__ import division  | 
            ||
| 5 | 5 | 
                import json  | 
            
| 6 | 6 | 
                 | 
            
| 7 | 7 | 
                from django.conf import settings  | 
            
| 8 | 
                +from django.db import transaction  | 
            |
| 8 | 9 | 
                from logit import logit  | 
            
| 9 | 10 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 10 | 11 | 
                 | 
            
                @@ -26,7 +27,7 @@ r = settings.REDIS_CACHE  | 
            ||
| 26 | 27 | 
                 | 
            
| 27 | 28 | 
                @logit  | 
            
| 28 | 29 | 
                def tgu_group_user_join_api(request):  | 
            
| 29 | 
                - """ 旅行团用户加群 """  | 
            |
| 30 | 
                + """ 旅行团成员加团 """  | 
            |
| 30 | 31 | 
                     admin_id = request.POST.get('admin_id', '')  # 导游唯一标识,识别二维码获取
               | 
            
| 31 | 32 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
| 32 | 33 | 
                     nickname = request.POST.get('nickname', '')
               | 
            
                @@ -100,7 +101,7 @@ def tgu_group_user_join_api(request):  | 
            ||
| 100 | 101 | 
                # 添加默认地理位置信息  | 
            
| 101 | 102 | 
                r.geoadd(TOUR_GUIDE_GROUP_GEO_INFO % group_id, 0, 0, user_id)  | 
            
| 102 | 103 | 
                 | 
            
| 103 | 
                -    return response(200, 'Apply Success', u'申请成功', {
               | 
            |
| 104 | 
                +    return response(200, 'Tour Guide User Join Success', u'旅行团成员加团成功', {
               | 
            |
| 104 | 105 | 
                         'current_id': curinfo.get('current_id', ''),
               | 
            
| 105 | 106 | 
                         'photos': curinfo.get('photos', ''),
               | 
            
| 106 | 107 | 
                'group_id': group_id,  | 
            
                @@ -111,8 +112,50 @@ def tgu_group_user_join_api(request):  | 
            ||
| 111 | 112 | 
                 | 
            
| 112 | 113 | 
                 | 
            
| 113 | 114 | 
                @logit  | 
            
| 115 | 
                +def tgu_group_user_remove_api(request):  | 
            |
| 116 | 
                + """ 旅行团成员移除,管理员主动,团成员被动 """  | 
            |
| 117 | 
                +    group_id = request.POST.get('group_id', '')
               | 
            |
| 118 | 
                +    admin_id = request.POST.get('admin_id', '')  # 导游唯一标识
               | 
            |
| 119 | 
                +    user_id = request.POST.get('user_id', '')
               | 
            |
| 120 | 
                +  | 
            |
| 121 | 
                + # 群组校验  | 
            |
| 122 | 
                + try:  | 
            |
| 123 | 
                + group = GroupInfo.objects.get(group_id=group_id)  | 
            |
| 124 | 
                + except GroupInfo.DoesNotExist:  | 
            |
| 125 | 
                + return response(GroupStatusCode.GROUP_NOT_FOUND)  | 
            |
| 126 | 
                +  | 
            |
| 127 | 
                + # 权限校验  | 
            |
| 128 | 
                + if not GroupUserInfo.objects.filter(group_id=group_id, user_id=admin_id, subadmin=True, status=True).exists() or admin_id == user_id: # 管理员也不允许将自己移除  | 
            |
| 129 | 
                + return response(GroupStatusCode.NO_UPDATE_PERMISSION)  | 
            |
| 130 | 
                +  | 
            |
| 131 | 
                + # 群组用户校验  | 
            |
| 132 | 
                + try:  | 
            |
| 133 | 
                + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True)  | 
            |
| 134 | 
                + except GroupUserInfo.DoesNotExist:  | 
            |
| 135 | 
                + return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)  | 
            |
| 136 | 
                +  | 
            |
| 137 | 
                + # 群组用户移除  | 
            |
| 138 | 
                + group_user.user_status = GroupUserInfo.DELETED  | 
            |
| 139 | 
                + group_user.deleted_at = tc.utc_datetime()  | 
            |
| 140 | 
                + group_user.save()  | 
            |
| 141 | 
                +  | 
            |
| 142 | 
                + # Redis 群组数据缓存更新  | 
            |
| 143 | 
                + group_users = set_group_users_info(group)  | 
            |
| 144 | 
                +  | 
            |
| 145 | 
                + # Redis 群组删除集合缓存  | 
            |
| 146 | 
                + r.srem(GROUP_USERS_PASSED_SET % group_id, user_id)  | 
            |
| 147 | 
                + r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id)  | 
            |
| 148 | 
                +  | 
            |
| 149 | 
                +    return response(200, 'Tour Guide User Remove Success', u'旅行团成员移除成功', {
               | 
            |
| 150 | 
                + 'group_id': group_id,  | 
            |
| 151 | 
                + 'users': group_users,  | 
            |
| 152 | 
                + })  | 
            |
| 153 | 
                +  | 
            |
| 154 | 
                +  | 
            |
| 155 | 
                +@logit  | 
            |
| 156 | 
                +@transaction.atomic  | 
            |
| 114 | 157 | 
                def tgu_group_user_update_api(request):  | 
            
| 115 | 
                - """ 旅行团用户更新 """  | 
            |
| 158 | 
                + """ 旅行团成员信息更新 """  | 
            |
| 116 | 159 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 117 | 160 | 
                     admin_id = request.POST.get('admin_id', '')  # 导游唯一标识
               | 
            
| 118 | 161 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
                @@ -139,7 +182,7 @@ def tgu_group_user_update_api(request):  | 
            ||
| 139 | 182 | 
                 | 
            
| 140 | 183 | 
                # 权限  | 
            
| 141 | 184 | 
                try:  | 
            
| 142 | 
                - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True)  | 
            |
| 185 | 
                + group_user = GroupUserInfo.objects.select_for_update().get(group_id=group_id, user_id=user_id, status=True)  | 
            |
| 143 | 186 | 
                except GroupUserInfo.DoesNotExist:  | 
            
| 144 | 187 | 
                return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)  | 
            
| 145 | 188 | 
                 | 
            
                @@ -160,7 +203,7 @@ def tgu_group_user_update_api(request):  | 
            ||
| 160 | 203 | 
                # Redis 群组用户数据缓存  | 
            
| 161 | 204 | 
                group_users = set_group_users_info(group)  | 
            
| 162 | 205 | 
                 | 
            
| 163 | 
                -    return response(200, 'Update Group Success', u'群组更新成功', {
               | 
            |
| 206 | 
                +    return response(200, 'Tour Guide User Update Success', u'旅行团成员信息更新成功', {
               | 
            |
| 164 | 207 | 
                'group_id': group_id,  | 
            
| 165 | 208 | 
                'group': group.data,  | 
            
| 166 | 209 | 
                'users': group_users,  | 
            
                @@ -169,7 +212,7 @@ def tgu_group_user_update_api(request):  | 
            ||
| 169 | 212 | 
                 | 
            
| 170 | 213 | 
                @logit  | 
            
| 171 | 214 | 
                def tgu_group_user_locations_api(request):  | 
            
| 172 | 
                - """ 旅行团所有用户位置信息 """  | 
            |
| 215 | 
                + """ 旅行团所有成员位置信息 """  | 
            |
| 173 | 216 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 174 | 217 | 
                     admin_id = request.POST.get('admin_id', '')  # 导游唯一标识
               | 
            
| 175 | 218 | 
                 | 
            
                @@ -188,7 +231,7 @@ def tgu_group_user_locations_api(request):  | 
            ||
| 188 | 231 | 
                'user_info': get_profile_by_id(loc[0])  | 
            
| 189 | 232 | 
                } for loc in locations]  | 
            
| 190 | 233 | 
                 | 
            
| 191 | 
                -    return response(200, 'Get Tour Guide Group All User Location Success', u'获取旅行团用户地理位置信息成功', {
               | 
            |
| 234 | 
                +    return response(200, 'Get Tour Guide Group All User Location Success', u'获取旅行团成员地理位置信息成功', {
               | 
            |
| 192 | 235 | 
                'group_id': group_id,  | 
            
| 193 | 236 | 
                'locations': locations,  | 
            
| 194 | 237 | 
                })  | 
            
                @@ -196,7 +239,7 @@ def tgu_group_user_locations_api(request):  | 
            ||
| 196 | 239 | 
                 | 
            
| 197 | 240 | 
                @logit  | 
            
| 198 | 241 | 
                def tgu_group_user_location_api(request):  | 
            
| 199 | 
                - """ 旅行团单个用户位置信息 """  | 
            |
| 242 | 
                + """ 旅行团单个成员位置信息 """  | 
            |
| 200 | 243 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 201 | 244 | 
                     admin_id = request.POST.get('admin_id', '')  # 导游唯一标识
               | 
            
| 202 | 245 | 
                     user_id = request.POST.get('user_id', '')
               | 
            
                @@ -208,7 +251,7 @@ def tgu_group_user_location_api(request):  | 
            ||
| 208 | 251 | 
                session_id = r.get(TOUR_GUIDE_GROUP_CUR_SESSION % group_id)  | 
            
| 209 | 252 | 
                locations = r.lrange(TOUR_GUIDE_GROUP_USER_GEO_LIST % (group_id, session_id, user_id), 0, -1)  | 
            
| 210 | 253 | 
                 | 
            
| 211 | 
                -    return response(200, 'Get Tour Guide Group User Location Success', u'获取旅行团用户地理位置信息成功', {
               | 
            |
| 254 | 
                +    return response(200, 'Get Tour Guide Group User Location Success', u'获取旅行团成员地理位置信息成功', {
               | 
            |
| 212 | 255 | 
                'group_id': group_id,  | 
            
| 213 | 256 | 
                'user_id': user_id,  | 
            
| 214 | 257 | 
                'locations': [json.loads(loc) for loc in locations]  | 
            
                @@ -229,7 +229,7 @@ def group_unlock_api(request):  | 
            ||
| 229 | 229 | 
                 | 
            
| 230 | 230 | 
                @logit  | 
            
| 231 | 231 | 
                def group_data_api(request):  | 
            
| 232 | 
                - """ 群组数据, 评论数, 点赞数 """  | 
            |
| 232 | 
                + """ 群组数据,评论数,点赞数 """  | 
            |
| 233 | 233 | 
                     group_id = request.POST.get('group_id', '')
               | 
            
| 234 | 234 | 
                 | 
            
| 235 | 235 | 
                     return response(200, 'Get Group Data Success', u'获取群组数据成功', {
               |